Du hast für den Gegenstand x und y für die Screen Position.
Dann einen Status, ob in Animation oder Auflösung oder was auch immer.
Dann einen Index, der zeigt in eine Tabelle welches Zeichen angezeigt werden soll. Für Auflösungsanimation oder ... hier verwende ich am Ende eine Marke, wenn die Animation zu ende sein soll.
Ich nutze hier mal das X-Register für den Gegenstand der sich irgendwo befinden kann.
Es gibt je eine Tabelle für die X und Y Position (hier 5)
Es gibt für jeden Gegenstand einen Status (hier unvollständig) und einen Index als Animationsregister.
Kannst Du bestimmt beliebig erweitern.
Mein Code ist jetzt erst mal auf 5 Character begrenzt, sollte aber schnell genug sein um 100 oder mehr in einer 1/50s zu bewegen. Mach es nicht im VBI!
Ist die Animation zu schnell, setze in der animation_table einen Wert 2 oder 3 mal hintereinander ein. Also .byte 1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,... die 0 am Ende verwenden wir als Marke fürs Ende, der Code reagiert darauf! So musst Du nicht selbst nochmal zählen.
Je nach Status lassen sich unterschiedliche Animationen unterbringen, die paar doppelten Bytes kann man verschmerzen. Beispiel angegeben, animation_table_2 kannst Du selbst.
Kommt es jetzt zu eine Collision, setzt Du an der entsprechenden Position von status ein 'animation_1' oder 'animation_2' und schon sollte die Animation gestartet werden. Es bleibt Dir überlassen, wie Du herausbekommst, mit welchem Gegenstand Du zusammengestoßen bist.
Der Assembler-Code mag nicht optimal sein, aber in Assembler ist mir das mittlerweile egal, der Atari ist dafür immer noch flott genug.
LG
Lars
screen=254 ; irgend eine Zeropage Adresse (2 Bytes)
animation_1=1
animation_2=2
normal=42
ldx welcher_gegenstand
ldy y,x
lda vertical_screen_position_table_low,y
sta screen
lda vertical_screen_position_table_high,y
sta screen+1
; hier haben wir jetzt in (screen) die vertikale Position
lda status,x
cmp #animation_1
beq is_animation_1
cmp #animation_2
beq is_animation_2
cmp #normal
beq is_normal
[...] ; hier mehr stati eintragen/pflegen...
is normal
lda #1
bne draw_character
is_animation_1
inc index,x
ldy index,x
lda animation_table_1,y
beq animation_ende
; in (screen) ist nur die vertikale Position an 0. Stelle angegeben,
; die horizontale Position kommt über den Index
draw_character
ldy x,x
sta (screen),y
rts
is_animation_2
inc index,x
ldy index,x
lda animation_table_2,y
beq animation_ende
bne draw_character
animation_ende
lda #normal ; die Animation ist zu ende alles zurücksetzen
sta status,x
lda #0
sta index,x
; lda #0 ; doppelt!
beq draw_character ; springt -> immer weil akku:=0
x
.byte 0,0,0,0,0
y
.byte 0,0,0,0,0
status
.byte 0,0,0,0,0
index
.byte 0,0,0,0,0
animation_table_1
.byte 1,2,3,4,5,6,7,8,9,10,0
vertical_screen_position_table_low
.byte <$BC40, <$BC40+40, <$BC40+80...
vertical_screen_position_table_high
.byte >$BC40, >$BC40+40, >$BC40+80...